/*******************************************************************************
 * Copyright (c) 2010, 2015 git@git.oschina.net:kaiwill/springstage.git
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 *******************************************************************************/
package com.qinyeit.serviceapp.service.system;

import com.alibaba.fastjson.JSONObject;
import com.qinyeit.serviceapp.entity.system.ManagementAccount;
import com.qinyetech.springstage.core.service.IBaseService;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.LockedAccountException;
import org.springframework.validation.BindingResult;

import java.util.List;
import java.util.Map;
import java.util.Set;

/** 
 * ClassName: ManagementAccountService <br/>
 * Function: 系统账号业务 <br/> 
 * date: 2015年8月22日 上午10:41:06 <br/> 
 * 
 * @author wuqing 
 * @version  
 * @since JDK 1.7 
 */
public interface ManagementAccountService extends IBaseService<ManagementAccount, Long> {
	
	/**
	 * getDefaultPassword:取得系统默认的密码,该密码在 application.yml文件中配置. <br/>
	 * systemAccount.default-password: 123456 <br />
	 * @author wuqing
	 * @return 
	 * @since JDK 1.7
	 */
	public String getDefaultPassword();

	/**
	 * updatePassword:修改密码. <br/>
	 * @author wuqing
	 * @param id 主键id
	 * @param password 明文密码
	 * @return 
	 * @since JDK 1.7
	 */
	public ManagementAccount updatePassword(Long id, String password) ;
	
	/**
	 * validatePassword:验证旧密码是否正确. <br/>
	 * @author wuqing
	 * @param id
	 * @param oldPassword
	 * @return 
	 * @since JDK 1.7
	 */
	public boolean validatePassword(Long id, String oldPassword);
	
	/**
	 * findByAdminAccount:根据账号查找. 管理员账号 <br/>
	 * @author wuqing
	 * @param account
	 * @return 
	 * @since JDK 1.7
	 */
	public ManagementAccount findByAccount(String account) ;

	/**\
	 * 获取管理员账号
	 * @param account
	 * @return
	 */
	ManagementAccount findByAdminAccount(String account);

	/**
	 *  商户员工登录，使用员工账号和管理员账号查询
	 * @param account
	 * @param adminAccount
	 * @return
	 */
	public ManagementAccount findByAccountWithAdmin(String account,String adminAccount);
	
	/**
	 * allotRole:为账号分配角色. <br/>
	 * @author wuqing
	 * @param id
	 * @param roleIds
	 * @return 
	 * @since JDK 1.7
	 */
	public ManagementAccount allotRole(Long id, List<Long> roleIds);

	/**
	 * authenticate: 登录认证. <br/>
	 * @author wuqing
	 * @param account
	 * @param password
	 * @return
	 * @throws AuthenticationException 用户名密码错误
	 * @throws LockedAccountException  账号被锁定
	 * @since JDK 1.7
	 */
	public ManagementAccount authenticate(String account, String password) throws AuthenticationException,LockedAccountException;

    /**
     * 根据账号获取角色字符串
     * @param account
     * @return
     */

	/**
	 * 查询账号角色串 code
	 * @param account  账号
	 * @param isAdmin 是否管理员
	 * @param adminAccount 管理员账号
	 * @return
	 */
	public Set<String> findRoleCodeSet(String account,boolean isAdmin,String adminAccount);

    /**
     * 根据账号获取权限字符串
     * @param account
     * @return
     */
    public Set<String> findPermissionCodeSet(String account);

	/**
	 * 解锁某用户账号
	 * @param currentAccount 当前登录者
	 * @param id 被解锁账号ID
	 * @return
	 */
	public boolean updateUnlock(ManagementAccount currentAccount, Long id);

	/**
	 * 更新头像
	 * @param currentAccount
	 */
	public void updatePicHead(ManagementAccount currentAccount);
	/**
	 * 验证是否有重复值
	 * @param id 记录ID
	 * @param account 账号
	 * @return
	 */
	public boolean existsRepeat(BindingResult result, Long id, String account);


	/**
	 * 分配保存账号
	 * @param data
	 *
	 */
	void saveAccount(JSONObject data, Long merchantGroupId);

	/**
	 * 根据账号获取角色
	 * @param accountId
	 * @param merchantGroupId
	 * @return
	 */
	List<Map<String,Object>> getRolesByAccount(Long accountId,Long merchantGroupId);


	/**
	 * 获取账号权限串
	 * @param accountId
	 * @return
	 */
	List<Map<String,Object>> getPermissionCodeSet(Long accountId);

	/**
	 * [移动端]
	 * 修改账号密码
	 * @param oldPassword 旧密码
	 * @param newPassword 新密码
	 * @param confirmPassword 确认密码
	 * @param accountId 账号id
	 * @return
	 */
	public ManagementAccount updateAccountPassword(String oldPassword,String newPassword,String confirmPassword,Long accountId);


}
